/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
 * bwcopiatrabajo
 * Copyright (C) Grupo de trabajo ULE 2010 <ulewii@googlegroups.com>
 * 
 * bwcopiatrabajo is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * bwcopiatrabajo is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "equipo.h"


Equipo::Equipo(std::string color, int varios_box)
{
	_boxVariable = varios_box;
	_id = color;

	for (int i = 0; i < 6; i ++)
		for (int j = 0; j< 6; j++)
		_bolas[i][j]= NULL;

	
	_boxSeleccionado = -1;
	_bolaSeleccionada = NULL;
	_activo = 0;
	ElementoDinamico *_bolas[6][6];
}

Equipo::~Equipo()
{
	// Hacer FREE a las bolas, pero se habrá de hacer desde
	//  conjunto_bolas
}

std::string Equipo::GetColor()
{
	return _id;
}

void Equipo::SetBox(int num_box)
{
	_boxSeleccionado = num_box-1;
}

int Equipo::GetBoxSeleccionado()
{
	return _boxSeleccionado;
}

void Equipo::AsignarBola(int num_box, ElementoDinamico* bola)
{
	for (int i = 0; i < 6; i++)
		if (_bolas[num_box-1][i] == NULL)
		{
			_bolas[num_box-1][i] = bola;
			break;
		}
}

int Equipo::MeQuedanBolas(int box)
{
	int bolas = 0;
	if (box != -1)
	{
	int selected_box = box;

	for (int i = 0; i < 6; i++)
		if (_bolas[selected_box-1][i] != NULL 
		    && !_bolas[selected_box-1][i]->Lanzada())
		bolas++;
	
	}
	else
	{
		for (int h = 0; h < 6; h++)
			for (int i = 0; i < 6; i++)
				if (_bolas[h][i] != NULL 
														&& !_bolas[h][i]->Lanzada())
				bolas++;
	}
	
	return bolas;
	
}
int Equipo::MeQuedanBolasBlandas(int box)
{
	int bolas = 0;
	int selected_box = _boxSeleccionado;
	
		for (int i = 0; i < 6; i++)
			if (_bolas[selected_box][i] != NULL)
				if (_bolas[selected_box][i]->GetIndiceDureza() == DUREZA_BLANDA 
				    && !_bolas[selected_box][i]->Lanzada())
			bolas++;
	
	return bolas;

}
int Equipo::MeQuedanBolasSemi(int box)
{
	int bolas = 0;
	int selected_box = _boxSeleccionado;
	
		for (int i = 0; i < 6; i++)
			if (_bolas[selected_box][i] != NULL)
				if (_bolas[selected_box][i]->GetIndiceDureza() == DUREZA_SEMI 
				    && !_bolas[selected_box][i]->Lanzada())
				bolas++;
	
	return bolas;
	
}
int Equipo::MeQuedanBolasDuras(int box)
{
	int bolas = 0;
	int selected_box = _boxSeleccionado;
	
		for (int i = 0; i < 6; i++)
			if (_bolas[selected_box][i] != NULL)
				if (_bolas[selected_box][i]->GetIndiceDureza() == DUREZA_DURA 
				    && !_bolas[selected_box][i]->Lanzada())
			bolas++;
	
	return bolas;
}


void Equipo::LanzadaBola()
{	
	if (_boxVariable)
		_boxSeleccionado = -1;
		
	_bolaSeleccionada = NULL;
}


void Equipo::SeleccionarBola(ElementoDinamico* bola_blanca)
{
	_bolaSeleccionada = bola_blanca;
}


void Equipo::SeleccionarBola(int dureza)
{
	for (int i = 0; i < 6; i++)
		if (_bolas[_boxSeleccionado][i] != NULL)
			if (_bolas[_boxSeleccionado][i]->GetIndiceDureza() == dureza 
				    && !_bolas[_boxSeleccionado][i]->Lanzada())
				_bolaSeleccionada = _bolas[_boxSeleccionado][i];
	
}


ElementoDinamico* Equipo::GetBolaSeleccionada()
{
	return _bolaSeleccionada;
}

long int Equipo::MeQuedaTiempo()
{
	return _tiempoRestante;
}

int Equipo::BorraBolasFuera()
{
	int bolas = 0;
	
	for (int i = 0; i < 6; i++)
		for (int j = 0; j < 6; j++)
			if (_bolas[i][j] != NULL)
				if (_bolas[i][j]->EsVisible() 
				    && !_bolas[i][j]->DentroCancha()
				    && _bolas[i][j]->Lanzada())
				{
					_bolas[i][j]->Mover(-20, -20, -20);
					_bolas[i][j]->SetVisibilidad(0);
					bolas++;
				}
	return bolas;
}

float Equipo::MenorDistancia(ElementoDinamico* bola_blanca)
{
	float distancia = 100;

	for (int i = 0; i < 6; i++)
		for (int j = 0; j < 6; j++)
		{
			if (_bolas[i][j] != NULL)
				if (_bolas[i][j]->Lanzada() 
					&& _bolas[i][j]->Distancia(bola_blanca) < distancia
				    && _bolas[i][j]->DentroCancha())
					distancia = _bolas[i][j]->Distancia(bola_blanca);
		}

	return distancia;
}


int Equipo::BolasPuntuables(float distancia, ElementoDinamico* bola_blanca)
{
	int bolas = 0;
	
	for (int i = 0; i < 6; i++)
		for (int j = 0; j < 6; j++)
		{
			if (_bolas[i][j] != NULL)
				if (_bolas[i][j]->Lanzada() 
				    && _bolas[i][j]->Distancia(bola_blanca) < distancia
				    && _bolas[i][j]->DentroCancha())
					bolas++;
		}

	return bolas;
}